package com.ydc.ln.tutorial.jndi.test;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

import org.apache.log4j.Logger;

/**
 * 
 * <p>
 * ��������ldap�Ĵ����࣬�ṩ�˸��ֲ���ldap�ķ�����
 * </p>
 * 
 * @author liaowufeng
 * @version 1.0
 */
public class LdapOperUtils {

	// ����log4j����־���������
	private static Logger log = Logger.getLogger(LdapOperUtils.class.getName());

	/**
	 * ���l��Env��Ϣ��ȡ��Ldap DirContext
	 * 
	 * @param env
	 *            l��Env��l����Ϣ
	 * @return Ldapl�ӵ�DirContext
	 * @throws BaseException
	 */
	private static DirContext getLdapDirContext(Env env) {
		// ����Ϊ��
		if (env == null) {
			String[] args = { "env" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter env NULL ");
			log.error(msglog.toString());

		}
		// ����DirContext
		DirContext dirContext = null;
		// ��Ldapl�ӹ����У�ȡ��Ldapl��
		dirContext = LdapConnectionFactory.getDirContext(env);
		return dirContext;
	}

	/**
	 * �����ldappool.properties�ļ������Ldap DirContext����ȡ��Ldap DirContext
	 * 
	 * @param dirContextName
	 *            Ldap DirContext����
	 * @return ���ز���Ldap �� DirContext
	 * @throws BaseException
	 */
	private static DirContext getLdapDirContext(String dirContextName, Env env) {
		// ����Ϊ��
		if (dirContextName.equals("")) {
			String[] args = { "dirContextName" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter dirContextName NULL ");
			log.error(msglog.toString());

		}
		// ����DirContext
		DirContext dirContext = null;
		// ��Ldapl�ӹ����У�ȡ��Ldapl��
		dirContext = LdapConnectionFactory.getDirContext(dirContextName, env);

		return dirContext;

	}

	/**
	 * �ر�LDAPl��
	 * 
	 * @param dirContext
	 *            DirContext
	 * @throws BaseException
	 */
	public static void closeEnvLdapDirContext(DirContext dirContext) {
		// �ر�LDAPl��
		closeLdapDirContext(dirContext);
	}

	/**
	 * �ر�Ldap ��DirContext
	 * 
	 * @param dirContext
	 *            l��Ldap��DirContext
	 * @throws BaseException
	 */
	private static void closeLdapDirContext(DirContext dirContext) {
		// ������ΪNULL
		if (dirContext == null) {
			String[] args = { "dirContext" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter conn NULL ");
			log.error(msglog.toString());
		}

		try {
			// �ر�
			dirContext.close();
		} catch (NamingException ex) {
			// �رղ��ɹ����ٴιر�
			if (log.isDebugEnabled()) {
				log.debug("Not close DirContext " + ex);
			}
			// ��¼��־
			log.error("Not close DirContext " + ex);
			ex.printStackTrace();
			try {
				// �ٴιر�
				dirContext.close();
			} catch (NamingException ex1) {
				// �ٴιر�ʧ��
				if (log.isDebugEnabled()) {
					log.debug("Not again close DirContext " + ex);
				}
				// ��¼��־
				log.error("Not again close DirContext " + ex);
				ex.printStackTrace();
				// �׳��쳣
			}
		}
	}

	/**
	 * ���캯��˽�У���ֹʵ��
	 */
	private LdapOperUtils() {
	}

	/**
	 * �ڵ�ǰ��Context ���һ����Context
	 * 
	 * @param context
	 *            l��DirContext
	 * @param cn
	 *            ��������Context
	 * @param attMap
	 *            Context �����ԣ�Map �� List ,key = ������,
	 *            ������ֵΪ��ֵʱ��Ϊlist,Ϊ��ֵʱ��ΪString
	 * @throws NamingException
	 * @throws BaseException
	 */
	public static void addContext(DirContext context, String cn, Map attMap)
			throws NamingException {

		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (cn.equals("")) {
			String[] args = { "cn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter cn NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (attMap == null) {
			String[] args = { "attMap" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter attMap NULL ");
			log.error(msglog.toString());
		}

		// Ϊ�գ����˳�
		if (attMap.isEmpty()) {
			return;
		}

		// ȡ���е�����key
		Set keySet = attMap.keySet();
		Iterator keyIterator = keySet.iterator();
		Attributes attrs = new BasicAttributes();
		// ������е�����key
		while (keyIterator.hasNext()) {

			// ȡ��һ������
			String key = (String) keyIterator.next();
			Attribute att = null;
			Object valueObj = attMap.get(key);
			// �ж���������
			if (valueObj instanceof String) {
				// Ϊ�ַ�Ϊ��ֵ����
				att = new BasicAttribute(key, valueObj);
			} else if (valueObj instanceof List) {
				// ΪList ,Ϊ��ֵ����
				att = new BasicAttribute(key);
				List valueList = (List) valueObj;
				// �����ֵ����
				for (int i = 0; i < valueList.size(); i++) {
					att.add(valueList.get(i));
				}
			} else {
				// �������ͣ������룬���ֽ����� �����룩
				att = new BasicAttribute(key, valueObj);
			}
			// ����
			attrs.put(att);
		}
		// ������Context
		context.createSubcontext(cn, attrs);
		// context.close();
	}

	/**
	 * �ڵ�ǰ��Context ɾ��һ����Context
	 * 
	 * @param context
	 *            l�ӵ�DirContext
	 * @param cn
	 *            �� Ҫɾ���Context�����
	 * @throws NamingException
	 * @throws BaseException
	 */
	public static void deleteContext(DirContext context, String cn)
			throws NamingException {

		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (cn.equals("")) {
			String[] args = { "cn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter cn NULL ");
			log.error(msglog.toString());
		}

		// ɾ��һ����Context
		context.destroySubcontext(cn);
		// �� context.close();

	}

	/**
	 * ��ݵ�ǰ��l��DirContext ������Context
	 * 
	 * @param context
	 *            l�Ӻ��DirContext
	 * @param cn
	 *            ����ԭContext�����
	 * @param newCn
	 *            �µ�Context���
	 * @throws NamingException
	 * @throws BaseException
	 */
	public static void reNameContext(DirContext context, String cn, String newCn)
			throws NamingException {

		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (cn.equals("")) {
			String[] args = { "cn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter cn NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (newCn.equals("")) {
			String[] args = { "newCn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter newCn NULL ");
			log.error(msglog.toString());
		}
		context.rename(cn, newCn);
		// context.close();
	}

	/**
	 * �ڵ�ǰl�ӵ�DirContext ָ����Context ���һ�� / �������
	 * 
	 * @param context
	 *            l�ӵ�DirContext
	 * @param cn
	 *            ���� ָ����Context
	 * @param attMap
	 *            Map �� List ,keyΪ������ƣ� value ����ֵ, ��Ϊ��ֵʱ����ΪList,��Ϊ��ֵʱ��ΪString����
	 * @throws BaseException
	 * @throws NamingException
	 */
	public static void addAttributes(DirContext context, String cn, Map attMap)
			throws NamingException {

		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (attMap == null) {
			String[] args = { "attMap" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter attMap NULL ");
			log.error(msglog.toString());
		}
		// ����Ϊ��
		if (cn.equals("")) {
			String[] args = { "cn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter cn NULL ");
			log.error(msglog.toString());
		}

		// Ϊ�գ��˳�
		if (attMap.isEmpty()) {
			return;
		}

		// ȡ���е�����key
		Set keySet = attMap.keySet();
		Iterator keyIterator = keySet.iterator();
		Attributes attrs = new BasicAttributes();
		// ������е�����key
		while (keyIterator.hasNext()) {

			// ȡ��һ������
			String key = (String) keyIterator.next();
			Attribute att = null;
			Object valueObj = attMap.get(key);
			// �ж���������
			if (valueObj instanceof String) {
				// Ϊ�ַ�Ϊ��ֵ����
				att = new BasicAttribute(key, valueObj);
			} else if (valueObj instanceof List) {
				// ΪList ,Ϊ��ֵ����
				att = new BasicAttribute(key);
				List valueList = (List) valueObj;
				// �����ֵ����
				for (int i = 0; i < valueList.size(); i++) {
					att.add(valueList.get(i));
				}
			}
			// ����
			attrs.put(att);
		}

		context.modifyAttributes(cn, DirContext.ADD_ATTRIBUTE, attrs);
		// context.close();
	}

	/**
	 * �ڵ�ǰ��l��DirContext ɾ�� ָ��Context �µ� һ�� / �������
	 * 
	 * @param context
	 *            l�Ӻ��DirContext
	 * @param cn
	 *            ָ��Context�����
	 * @param attList
	 *            ��Ҫɾ������Ե����,ΪList����
	 * @throws BaseException
	 * @throws NamingException
	 */

	public static void deleteAttributes(DirContext context, String cn,
			List attList) throws NamingException {
		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (attList == null) {
			String[] args = { "attList" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter attList NULL ");
			log.error(msglog.toString());
		}
		// ����Ϊ��
		if (cn.equals("")) {
			String[] args = { "cn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter cn NULL ");
			log.error(msglog.toString());
		}

		// Ϊ�գ��˳�
		if (attList.isEmpty()) {
			return;
		}

		Attributes attrs = new BasicAttributes();

		for (int i = 0; i < attList.size(); i++) {
			Attribute att = null;
			att = new BasicAttribute((String) attList.get(i));
			// ����
			attrs.put(att);
		}
		context.modifyAttributes(cn, DirContext.REMOVE_ATTRIBUTE, attrs);
		// context.close();
	}

	/**
	 * �ڵ�ǰl�ӵ�DirContext �޸�ָ��Context�µ�һ�� �� �������
	 * 
	 * @param context
	 *            l�ӵ�DirContext
	 * @param cn
	 *            ָ��Context�µ�����
	 * @param attMap
	 *            ��List keyΪ������ƣ�������Ϊ��ֵʱ value Ϊ���ֵ��List,Ϊ��ֵʱ��Ϊ��ֵ��String����
	 * @throws BaseException
	 * @throws NamingException
	 */
	public static void modifyAttributes(DirContext context, String cn,
			Map attMap) throws NamingException {

		// ����Ϊ��
		if (context == null) {
			String[] args = { "context" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter context NULL ");
			log.error(msglog.toString());
		}

		// ����Ϊ��
		if (attMap == null) {
			String[] args = { "attMap" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter attMap NULL ");
			log.error(msglog.toString());
		}
		// ����Ϊ��
		if (cn.equals("")) {
			String[] args = { "cn" };
			// ��ӡ������־
			StringBuffer msglog = new StringBuffer(
					"empty invoke parameter cn NULL ");
			log.error(msglog.toString());
		}

		// Ϊ�գ��˳�
		if (attMap.isEmpty()) {
			return;
		}
		// ȡ���е�����key
		Set keySet = attMap.keySet();
		Iterator keyIterator = keySet.iterator();
		Attributes attrs = new BasicAttributes();
		// ������е�����key
		while (keyIterator.hasNext()) {
			// ȡ��һ������
			String key = (String) keyIterator.next();
			Attribute att = null;
			Object valueObj = attMap.get(key);

			if (valueObj instanceof List) {
				// ΪList ,Ϊ��ֵ����
				att = new BasicAttribute(key);
				List valueList = (List) valueObj;
				// �����ֵ����
				for (int i = 0; i < valueList.size(); i++) {
					att.add(valueList.get(i));
				}
			} else if (valueObj instanceof String) {
				att = new BasicAttribute(key, valueObj);
			}
			// ����
			attrs.put(att);
		}
		context.modifyAttributes(cn, DirContext.REPLACE_ATTRIBUTE, attrs);
		// context.close();
	}

	//
	/**
	 * ��ȡl�ӵ�DirContext��ָ��Context�µ�ָ������
	 * 
	 * @param context
	 *            l�ӵ�DirContext
	 * @param cn
	 *            ��ָ��Context�����
	 * @param attNameList
	 *            Ҫȡ�����Ե����List
	 * @return Map��List ,key Ϊ���Ե����,������ֵΪ��ֵʱ��ValueΪList���ͣ� ����value ΪString ����
	 * @throws NamingException
	 */
	public static Map getAttributes(DirContext context, String cn,
			List attNameList) throws NamingException {
		Map attsMap = new HashMap();
		Attributes results = null;
		List attValList = null;
		String attrId = null;

		if (attNameList == null) {
			results = context.getAttributes(cn);
		} else {
			if (!attNameList.isEmpty()) {
				// results = context.getAttributes(cn);
				String[] stTemp = new String[attNameList.size()];
				// ///////////////////////////////////////// ���·�������̫��
				// ////////////////////////////////
				// ����������������for (int i = 0; i < attNameList.size(); i++) {
				// ��������������������stTemp = (String) attNameList.get(i);
				// ����������������}
				// ����������������results = context.getAttributes(cn,
				// ������������������������������������������������stTemp);
				// /////////////////////////////////////////////////////////////////////////////////////////
				// �Ƚϸ����ܵ�List תΪ ����ķ���
				results = context.getAttributes(cn, (String[]) (attNameList
						.toArray(stTemp)));
			}
		}
		for (int i = 0; i < attNameList.size(); i++) {
			Attribute attr = results.get((String) attNameList.get(i));
			attrId = (String) attNameList.get(i);
			if (attr != null) {
				if (attr.size() > 0) {
					NamingEnumeration vals = attr.getAll();
					if (vals == null) {
						continue;
					}
					Object obj1 = vals.nextElement();
					if (obj1 == null) {
						continue;
					}
					// ���������Ե���������ֵ
					while (vals.hasMoreElements()) {
						if (attValList == null) {
							attValList = new ArrayList();
							attValList.add(obj1);
						}
						attValList.add(vals.nextElement());
					}
					// ������Ϊ��ֵ��ʱ����Ϊ�ַ�
					// ������Ϊ��ֵ��ʱ����Ϊ���ֵ���List
					if (attValList != null) {
						attsMap.put(attrId, attValList);
						// ���
						attValList = null;
					} else {
						attsMap.put(attrId, obj1);
					}
				}
			}
		}
		// context.close();
		return attsMap;
	}

	/**
	 * �ڵ�ǰl�ӵ�DirContext ��ȡָ��Context�µ�ָ��������Ƶ���������ֵ��һ�����ֵ��
	 * 
	 * @param context
	 *            l�ӵ�DirContext
	 * @param cn
	 *            ��ָ��Context��cn��
	 * @param attName
	 *            �������
	 * @return ���ذ�(����ֵ��List ע�⣬������ֻ��һ��ֵʱ�����ص�List����Ϊ1�������� �Ƕ�ֵ����ʱ������List����Ϊ����ֵ����Ŀ
	 * @throws NamingException
	 */
	public static List getAttributeValues(DirContext context, String cn,
			String attName) throws NamingException {
		List attValList = new ArrayList();
		List attNameList = new ArrayList();
		attNameList.add(attName);
		Map attMap = null;
		attMap = getAttributes(context, cn, attNameList);

		if (attMap != null) {
			Object attValObj = attMap.get(attName);
			if (attValObj instanceof String) {
				attValList.add((String) attValObj);
			} else if (attValObj instanceof List) {
				attValList = ((List) attValObj);
			}
		}
		// context.close();
		return attValList;
	}

	/**
	 * ��ȡ��ɫ�������Ϣ
	 * 
	 * @param context
	 *            DirContext
	 * @param cn
	 *            String
	 * @param attName
	 *            String
	 * @return String
	 * @throws NamingException
	 */
	public static String getRoleAttributeValues(DirContext context, String cn,
			String attName) throws NamingException {
		String result = "";
		List attNameList = new ArrayList();
		attNameList.add(attName);
		Map attMap = null;
		attMap = getAttributes(context, cn, attNameList);

		if (attMap != null) {
			Object attValObj = attMap.get(attName);
			result = (String) attValObj;
		}
		return result;
	}

	/**
	 * ����������ָ��CN��Context�µ�һ����������
	 * 
	 * @param context
	 *            l���˵�DirContext
	 * @param cn
	 *            Ҫ��ѯ��BaseCN���
	 * @param filter
	 *            Ҫ��ѯ�Ĺ����ַ�
	 * @return ��ϲ�ѯ����List
	 * @throws NamingException
	 */
	public static List searchContextOne(DirContext context, String cn,
			String filter) throws NamingException {
		List resultList = new ArrayList();
		Map resultRowMap = null;
		List attValList = null;
		String attValStr = null;
		// ʵ��һ��������
		SearchControls constraints = new SearchControls();
		// ���������������Χ
		constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);
		// �ڻ�Ŀ¼���������ΪEnv.MY_FILTER���������� ע�⣺���ﷵ���ǵ����е���Ŀ����
		NamingEnumeration results = context.search(cn, filter, constraints);

		// ��ӡ��Ŀ��ʶ����(DN)�������е�������ֵ
		while (results != null && results.hasMore()) {
			// ȡһ����Ŀ
			SearchResult si = (SearchResult) results.next();

			// ��ȡ��Ŀ���������Լ���
			Attributes attrs = si.getAttributes();
			if (attrs != null) {
				String attrId = null;
				// һ�����
				resultRowMap = new HashMap();
				// ��ӡ��������
				for (NamingEnumeration ae = attrs.getAll(); ae
						.hasMoreElements();) {
					// ��ȡһ������
					Attribute attr = (Attribute) ae.next();
					attrId = attr.getID();
					Enumeration vals = attr.getAll();
					if (vals == null) {
						continue;
					}
					Object obj1 = vals.nextElement();
					if (obj1 == null) {
						continue;
					}
					// ���������Ե���������ֵ
					while (vals.hasMoreElements()) {
						if (attValList == null) {
							attValList = new ArrayList();
							attValList.add(obj1);
						}
						attValList.add(vals.nextElement());
					}
					// ������Ϊ��ֵ��ʱ����Ϊ�ַ�
					// ������Ϊ��ֵ��ʱ����Ϊ���ֵ���List
					if (attValList != null) {
						resultRowMap.put(attrId, attValList);
						// ���
						attValList = null;
					} else {
						resultRowMap.put(attrId, obj1);
					}

				}
			}
			resultList.add(resultRowMap);
		}
		return resultList;
	}

	/**
	 * �����������ָ��CN��Context�µ������µ���������
	 * 
	 * @param context
	 *            l���˵�DirContext
	 * @param cn
	 *            Ҫ��ѯ��BaseCN���
	 * @param filter
	 *            Ҫ��ѯ�Ĺ����ַ�
	 * @return ��ϲ�ѯ����List
	 * @throws NamingException
	 */
	public static List searchContextSub(DirContext context, String cn,
			String filter) throws NamingException {
		List resultList = new ArrayList();
		Map resultRowMap = null;
		List attValList = null;
		// ʵ��һ��������
		SearchControls constraints = new SearchControls();
		// ���������������Χ
		constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
		// �ڻ�Ŀ¼���������ΪEnv.MY_FILTER���������� ע�⣺���ﷵ���ǵ����е���Ŀ����
		NamingEnumeration results = context.search(cn, filter, constraints);

		// ��ӡ��Ŀ��ʶ����(DN)�������е�������ֵ
		while (results != null && results.hasMore()) {
			// ȡһ����Ŀ
			SearchResult si = (SearchResult) results.next();

			// ��ȡ��Ŀ���������Լ���
			Attributes attrs = si.getAttributes();
			if (attrs != null) {
				String attrId = null;
				// һ�����
				resultRowMap = new HashMap();
				// ��ӡ��������ֵ
				for (NamingEnumeration ae = attrs.getAll(); ae
						.hasMoreElements();) {
					// ��ȡһ������
					Attribute attr = (Attribute) ae.next();
					attrId = attr.getID();
					Enumeration vals = attr.getAll();
					if (vals == null) {
						continue;
					}
					Object obj1 = vals.nextElement();
					if (obj1 == null) {
						continue;
					}
					// ���������Ե���������ֵ
					while (vals.hasMoreElements()) {
						if (attValList == null) {
							attValList = new ArrayList();
							attValList.add(obj1);
						}
						attValList.add(vals.nextElement());
					}
					// ������Ϊ��ֵ��ʱ����Ϊ�ַ�
					// ������Ϊ��ֵ��ʱ����Ϊ���ֵ���List
					if (attValList != null) {
						resultRowMap.put(attrId, attValList);
						// ���
						attValList = null;
					} else {
						resultRowMap.put(attrId, obj1);
					}
				}
			}
			resultList.add(resultRowMap);
		}
		return resultList;
	}

	/**
	 * ����ָ��CN��Context�µ������µ�ָ������
	 * 
	 * @param context
	 *            DirContext
	 * @param cn
	 *            String
	 * @param filter
	 *            String
	 * @param returnedAtts
	 *            String[] ������������
	 * @return List
	 * @throws NamingException
	 */
	public static List searchContextSub(DirContext context, String cn,
			String filter, String[] returnedAtts) throws NamingException {
		List resultList = new ArrayList();
		String attrId = null;
		List attValList = null;
		Map resultRowMap = null;
		// ʵ��һ��������
		SearchControls constraints = new SearchControls();
		// ���������������Χ
		constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
		// String[] returnedAtts = {"uniquemember"};
		constraints.setReturningAttributes(returnedAtts);
		// ��Ŀ
		NamingEnumeration results = context.search(cn, filter, constraints);

		// ������е���Ŀ
		while (results != null && results.hasMore()) {
			// ȡһ����Ŀ
			SearchResult si = (SearchResult) results.next();
			resultRowMap = new HashMap();
			// ��ȡ��Ŀ��ָ�����ص�����
			Attributes attrs = si.getAttributes();

			if (attrs != null) {
				// �����������ֵ
				for (NamingEnumeration ae = attrs.getAll(); ae
						.hasMoreElements();) {

					// ��ȡһ������
					Attribute attr = (Attribute) ae.next();
					attrId = attr.getID();
					Enumeration vals = attr.getAll();
					if (vals == null) {
						continue;
					}
					// ���������Ե���������ֵ
					while (vals.hasMoreElements()) {
						if (attValList == null) {
							attValList = new ArrayList();
						}
						attValList.add(vals.nextElement());
					}
					// ������Ϊ��ֵ��ʱ����Ϊ�ַ�
					// ������Ϊ��ֵ��ʱ����Ϊ���ֵ���List
					if (attValList != null) {
						resultRowMap.put(attrId, attValList);
						// ���
						attValList = null;
					}
				}
			}
			resultList.add(resultRowMap);
		}
		return resultList;
	}

	/**
	 * ����ָ��CN��Context�µ�һ��ָ������
	 * 
	 * @param context
	 *            DirContext
	 * @param cn
	 *            String
	 * @param filter
	 *            String
	 * @param returnedAtts
	 *            String[] ������������
	 * @return List
	 * @throws NamingException
	 */
	public static List searchContextOne(DirContext context, String cn,
			String filter, String[] returnedAtts) throws NamingException {
		List resultList = new ArrayList();
		String attrId = null;
		List attValList = null;
		Map resultRowMap = null;
		// ʵ��һ��������
		SearchControls constraints = new SearchControls();
		// ���������������Χ
		constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);
		// String[] returnedAtts = {"uniquemember"};
		constraints.setReturningAttributes(returnedAtts);
		// ��Ŀ
		NamingEnumeration results = context.search(cn, filter, constraints);

		// ������е���Ŀ
		while (results != null && results.hasMore()) {
			// ȡһ����Ŀ
			SearchResult si = (SearchResult) results.next();
			resultRowMap = new HashMap();
			// ��ȡ��Ŀ��ָ�����ص�����
			Attributes attrs = si.getAttributes();
			if (attrs != null) {
				// �����������ֵ
				for (NamingEnumeration ae = attrs.getAll(); ae
						.hasMoreElements();) {

					// ��ȡһ������
					Attribute attr = (Attribute) ae.next();
					attrId = attr.getID();
					Enumeration vals = attr.getAll();
					if (vals == null) {
						continue;
					}
					Object obj1 = vals.nextElement();
					if (obj1 == null) {
						continue;
					}
					// ���������Ե���������ֵ
					while (vals.hasMoreElements()) {
						if (attValList == null) {
							attValList = new ArrayList();
							attValList.add(obj1);
						}
						attValList.add(vals.nextElement());
					}
					// ������Ϊ��ֵ��ʱ����Ϊ�ַ�
					// ������Ϊ��ֵ��ʱ����Ϊ���ֵ���List
					if (attValList != null) {
						resultRowMap.put(attrId, attValList);
						// ���
						attValList = null;
					} else {
						resultRowMap.put(attrId, obj1);
					}
				}
			}
			resultList.add(resultRowMap);
		}
		return resultList;
	}

	/**
	 * �ڵ�ǰ��l��DirContext ɾ�� ָ��Context �µ� һ������������������
	 * 
	 * @param context
	 *            l�Ӻ��DirContext
	 * @param cn
	 *            ָ��Context�����
	 * @param attList
	 *            ��Ҫɾ������Ե����
	 * @throws BaseException
	 * @throws NamingException
	 */
	public static void deleteInAttributes(DirContext ctx, String userDN,
			List attList, String flag) throws NamingException {
		if (attList == null || attList.size() == 0) {
			return;
		} else {
			int size = attList.size();
			ModificationItem[] mods = new ModificationItem[size];
			for (int i = 0; i < size; i++) {
				Attribute att = null;
				mods[i] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
						new BasicAttribute(flag, (String) attList.get(i)));
			}
			ctx.modifyAttributes(userDN, mods);
		}
	}
	/*
*//**
	 * ����һ��l�ӣ�ͨ��׽Exception4ȷ�����û��Ƿ������Ŀ��ldap��
	 * 
	 * @param configDto
	 *            ConfigDto
	 * @param uid
	 *            String
	 * @param password
	 *            char[]
	 * @return boolean
	 * @throws NamingException
	 */
	/*
	 * public static boolean authenticate(ConfigDto configDto, String uid,
	 * char[] password) throws NamingException { Hashtable mEnvironment = new
	 * Hashtable(); DirContext mContext = null; //����l��
	 * mEnvironment.put(Context.INITIAL_CONTEXT_FACTORY,
	 * configDto.getEnvfactory()); mEnvironment.put(Context.PROVIDER_URL,
	 * configDto.getEnvurl()); mEnvironment.put(Context.SECURITY_AUTHENTICATION,
	 * "simple"); mEnvironment.put(Context.SECURITY_PRINCIPAL,
	 * Constants.LDAP_PEOPLE_ATTRIBUTE_UID + "=" + uid + "," +
	 * configDto.getEnvPeopleLoc());
	 * mEnvironment.put(Context.SECURITY_CREDENTIALS, password); try { mContext
	 * = new InitialDirContext(mEnvironment); log.debug("user:"+uid+" login!");
	 * return true; } catch (AuthenticationException ex) {
	 * log.error("user:"+uid+
	 * " don't login because of wrong user name or password!"); return false; }
	 */
}